import sun.misc.Request
import javax.xml.bind.ValidationEvent

fun main(args: Array<String>) {
    /**
     * when{:.keyword}取代了类C语言switch操作符。其最简单的形式如下：
     */
    var x = 3
    when (x) {
        1 -> print("x==1")
        2 -> print("x==2")
        else -> {//注意这个块
            print("x is neither 1 nor 2")
        }
    }

    /**
     * when{:.keyword}将它的参数与所有的分支条件顺序比较，直到某个分支满足条件
     * when{:.keyword}既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式，符合条件的分支的值就是整个表达式的值，如果
     * 当做语句使用，则忽略个别分支的值。（像if{:.keyword}一样，每一个分支可以是一个代码块，它的值是块中最后的表达式的值。）
     *
     * 如果其他分支都不满足条件将会求值 else{: .keyword } 分支。
     * 如果 when{: .keyword } 作为一个表达式使用，则必须有 else{: .keyword } 分支，
     * 除非编译器能够检测出所有的可能情况都已经覆盖了［例如，对于 枚举（enum{: .keyword }）类条目与密封
     * （sealed{: .keyword }）类子类型］。
     * 如果很多分支需要用相同的方式处理，则可以把多个分支条件放在一起，用逗号分隔：
     */
    when (x) {
        0, 1 -> print("x == 0 or x == 1")
        else -> print("otherwise")
    }
    //我们可以用任意表达式（而不只是常量）作为分支条件
    var s = "1"
    when (x) {
        parseInt(s) -> print("s encodes x")
        else -> print("s does not encode x")
    }
    //我们可以检测一个值在（in{:.keyword}）或者不在（!in{:.keyword}）一个区间或者集合中：
    var validNumbers = 11..20
    when (x) {
        in 1..10 -> print("x is in the range")
        in validNumbers -> print("x is valid")
        !in 10..20 -> print("x is outside the range")
        else -> print("none of the above")
    }

    //when{:.keyword}也可以用来取代if{:.keyword}-else{:.keyword}if{:.keyword}链
    //如果不提供参数，所有的分支条件都是简单的布尔表达式，而当一个分支的条件为真时则执行该分支：
//    when {
//        x.isOdd() -> print("x is odd")
//        x.isEven() -> print("x is even")
//        else -> print("x is funny)
//    }


}



//另一种可能性是检测一个值是（is{:.keyword}）或者不是（!is{:.keyword}）一个特定类型的值。注意：
//由于智能转换，你可以访问该类型的方法与属性而无需任何额外的检测
fun hasPrefix(x: Any) = when (x) {
    is String -> x.startsWith("prefix")
    else -> false
}

//fun Request.getBody(){
//    when (val response = executeRequest()) {
//        is Success -> response.body
//        is HttpError -> throw HttpException(response.status)
//    }
//}

